from pyautocad import Autocad, APoint, aDouble
import math

# 连接CAD
acad= Autocad(create_if_not_exists=True)
acad.prompt("Hello! AutoCAD from pyautocad.")
print(acad.doc.Name) # 文件名
msp = acad.model # 模型空间

# 绘点
acad.doc.SetVariable("PDMODE", 35) # 设置点样式的显示方式
acad.doc.SetVariable("PDSIZE", 2)  # 设置点大小
ptObj = msp.AddPoint(APoint(0, 5))


# 绘直线
startPoint = APoint(5, 8) 
endPoint = APoint(20, 15)  # pyautocad自动将各坐标转化为双精度浮点数。
lineObj = msp.AddLine(startPoint, endPoint)


#绘多段线
pnts = [(5,5,0), (10,5,0), (20,20,0), (25, 20,0)] # (x,y,z)
pnts = [j for i in pnts for j in i]  # 拍平
# 亦 [j for j in APoint(5, 5)] 即 [5, 5, 0]
pnts = aDouble(pnts) # 数据类型转化为双精度浮点数数组
plineObj = msp.AddPolyLine(pnts)
bulgeValue = math.tan(math.pi / 8)  # 圆弧凸度。
plineObj.SetBulge(1, bulgeValue)
# 将多段线的第2部分设置为凸度为bulgevalue的圆弧。


# 线样式
version = acad.app.Version[:2]  # 当前CAD的版本号
clr = acad.app.GetInterfaceObject(f"AutoCAD.AcCmColor.{version}")
clr.SetRGB(0, 0, 255)  # 创建蓝色
plineObj.TrueColor = clr  # 指定颜色
segmentIndex = 2  # 多段线的段号，从0起计数。
startWidth = 0.5  # 段起点处线宽
endWidth = 1.0  # 段终点处线宽
plineObj.SetWidth(segmentIndex, startWidth, endWidth)  # 为多段线plineObj的第3段设置变宽度线宽
acad.doc.preferences.LineweightDisplay = 1  # 显示线宽
acad.doc.Application.ZoomAll()
acad.doc.Application.Update()


# 圆、椭圆、弧
circleObj = msp.AddCircle(APoint(5,5), 4) # 圆
arcObj = msp.AddArc(APoint(15,5), 4, math.radians(-60), math.radians(60))
center = APoint(8, 5, 0)  # 椭圆中心
majAxis = APoint(5, 0, 0)  # 主轴（长轴）端点相对于椭圆中心的坐标增量。
radRatio = 0.5  # 短长轴之比为0.5
ellObj = msp.AddEllipse(center, majAxis, radRatio)
ellObj2 = msp.AddEllipse(APoint(8, 15, 0), majAxis, radRatio)
ellObj2.startAngle = -math.pi/2 # 椭圆弧起点
ellObj2.endAngle = math.pi/2 #椭圆弧终点


# 样条曲线
pnts # 多段线处的点
startTan = APoint(1, -10)  # startTan为样条曲线起点处切线的方向向量。
endTan = APoint(1, -5)  # endTan为样条曲线终点处切线的方向向量。
SplineObj = msp.AddSpline(pnts, startTan, endTan)


# 实体填充
pnt1,pnt2,pnt3,pnt4 = APoint(-10,5,0), APoint(-10,10,0), APoint(-3,5,0), APoint(-3,10,0)
solidObj = msp.AddSolid(pnt1, pnt2, pnt3, pnt4) # 实体填充